package main

import "fmt"

// Author : CSR丶WARRIOR
// Time ： 2020/10/16  23:02
// TOOLS : GoLand
// FILENAME : PolymorphismDemo2.go
// STATEMENT:使用多态完成计算器案例
type operators struct {
	num1 float64
	num2 float64
}

//定义加减法相关的结构体
type add struct {
	operators
}
type sub struct {
	operators
}

//定义一个获取结果的接口
type getRes interface {
	getResult() float64
	setData(data ...interface{}) bool
}

func (a *add) getResult() float64 {
	return a.num1 + a.num2
}

//setData
func (a *add) setData(data ...interface{}) bool {
	var flag = true
	if len(data) > 2 {
		fmt.Println("参数个数错误")
		flag = false
	}
	value, ok := data[0].(float64)
	if !ok {
		fmt.Println("第一个数类型错误")
		flag = false
	}
	value1, ok1 := data[1].(float64)
	if !ok1 {
		fmt.Println("第二个数类型错误")
		flag = false
	}
	a.num1 = value
	a.num2 = value1
	return flag
}

//setData
func (s *sub) setData(data ...interface{}) bool {
	var flag = true
	if len(data) > 2 {
		fmt.Println("参数个数错误")
		flag = false
	}
	value, ok := data[0].(float64)
	if !ok {
		fmt.Println("第一个数类型错误")
		flag = false
	}
	value1, ok1 := data[1].(float64)
	if !ok1 {
		fmt.Println("第二个数类型错误")
		flag = false
	}
	s.num1 = value
	s.num2 = value1
	return flag
}

func (s *sub) getResult() float64 {
	return s.num1 - s.num2
}

type operationFactory struct {
}

func (f *operationFactory) calc(op string, num1 float64, num2 float64) float64 {
	switch op {
	case "+":
		//创建加法的对象
		var a add
		if a.setData(num1, num2) {
			return returnRes(&a)
		}
	case "-":
		//创建减法对象
		var s sub
		if s.setData(num1, num2) {
			return returnRes(&s)
		}
	default:
		return 0

	}
	return 0
}

//利用多态创建返回结果的一个方法
func returnRes(g getRes) float64 {
	return g.getResult()
}
func main() {
	var op operationFactory
	res := op.calc("+", 16.9, 22.33)
	fmt.Println(res) //39.31
}
